<?php
class Usuarios extends MY_Controller {

	// Datos para pasar a las vistas
	var $pageTitle = 'Prevet :: Usuarios';
	var $nombre_entidad = 'Usuario';		// Cadena utilizada para los títulos de las páginas

	// Vistas manejadas por el controlador
	var $CARPETA_VISTAS = 'usuarios/';
	var $pagina_ver_todos;
	var $pagina_editar;

	public function __construct()
    {
    	parent::__construct();

    	$this->pagina_ver_todos = $this->CARPETA_VISTAS . 'usuario_ver_todos_view';
    	$this->pagina_editar = $this->CARPETA_VISTAS . 'usuario_edit_view';
	}
	
	public function nuevo()
	{
		$dataView['title'] = 'Agregar ' . $this->nombre_entidad;
		$dataView['id_elemento'] = NULL; 	// IMPORTANTE: debe ser nulo para uno nuevo

		$this->_cargarFormEdicion($dataView);
	}

	public function editar($id_elemento)
	{
		$dataView['title'] = 'Editar ' . $this->nombre_entidad;
		$dataView['id_elemento'] = $id_elemento;

		$this->_cargarFormEdicion($dataView);
	}

	private function _cargarFormEdicion($dataView)
	{
		if(!isset($dataView['obj'.$this->nombre_entidad]))
		{
			$id_elemento = $dataView['id_elemento'];

			// Creo un objeto del modelo, para poblarlo con los datos que necesito mostrar
			$obj_usuario = new Usuario($id_elemento);
			$dataView['obj'.$this->nombre_entidad] = $obj_usuario;
		}

		// Valido si el usuario es editable antes de continuar
		$obj_usuario = $dataView['obj'.$this->nombre_entidad];
		if(($obj_usuario->id != NULL && $obj_usuario->editable) || $obj_usuario->id == NULL) {
			// Creo un objeto del modelo, para poder buscar todos los datos en la BD
			$obj_rol = new Rol();
			$dataView['listado_roles'] = $obj_rol->get_iterated();

			parent::_loadViews($this->pagina_editar, $dataView);
		}
		else {
			$dataView['error'] = 'El usuario ' . $obj_usuario->nombre_usuario . ' no puede editarse.';
			$this->ver_todos($dataView);
		}
	}

	public function guardar()
	{
		$dataView['title'] = 'Guardar ' . $this->nombre_entidad;
		$dataView['error'] = '';

		// Se obtienen los datos del formulario para poblar el modelo
		$id_usuario = is_numeric($this->input->post('txt_id')) ? $this->input->post('txt_id') : NULL;
		$obj_usuario = new Usuario($id_usuario);

		$obj_usuario->nombre_usuario = $this->input->post('txt_nombre');
		
		$fecha_actual = date('d/m/Y');
		if($id_usuario == 0 || $id_usuario == NULL) {
			$obj_usuario->fecha_alta = $fecha_actual;
			
			// Si el usuario es nuevo, guardo la clave ingresada.
			$obj_usuario->clave = $this->input->post('txt_clave');
			$obj_usuario->baja = FALSE;
		}
		else {
			// Si es un usuario existente, verifico si se ingresó una clave nueva para actualizarla, o sino lo dejo como está
			$clave_nueva = trim($this->input->post('txt_clave_nueva'));
			if($clave_nueva != '') $obj_usuario->clave = $clave_nueva;
		}

		$obj_usuario->editable = TRUE;

		// Defino el objeto que se desea asociar
		$id_rol = is_numeric($this->input->post('sel_rol')) ? $this->input->post('sel_rol') : NULL;
		$obj_rol = new Rol($id_rol);

		// Se manejan transacciones para interactuar con la BD
		$obj_usuario->trans_begin();
		$operacion_exitosa = $obj_usuario->save($obj_rol);
		if(!$operacion_exitosa && !$obj_usuario->valid) // Falló la validación de datos
		{
			// Vuelvo a cargar el formulario de edición y mostrar los errores de validación
			$dataView['obj'.$this->nombre_entidad] = $obj_usuario;
			$dataView['error'] = $obj_usuario->error->string;
			$this->_cargarFormEdicion($dataView);
		}
		else
		{
			if ($obj_usuario->trans_status() === FALSE) // Se chequea el estado de la transacción
			{
			    $obj_usuario->trans_rollback(); // Si la transacción falló, hago un rollback
			}
			else
			{
			    $obj_usuario->trans_commit(); // Transacción exitosa, realizo el commit
			}

			$dataView['error'] = $obj_usuario->error->string; // Almaceno todos los errores que hubieran podido ocurrir
			$this->ver_todos($dataView);
		}
	}

	public function ver_todos($dataView = array())
	{
		$dataView['title'] = 'Listado de ' . $this->nombre_entidad . 's';

		// Creo un objeto del modelo, para poblarlo con los datos que necesito mostrar
		$obj_usuario = new Usuario();
		$obj_usuario->get_iterated(); // Obtengo todos los elementos

		$dataView['listado'] = $obj_usuario;
		parent::_loadViews($this->pagina_ver_todos, $dataView);
	}


	public function cambiar_estado($id_elemento)
	{
		$dataView['title'] = 'Cambiar estado de ' . $this->nombre_entidad;
		$dataView['error'] = '';

		if(isset($_SESSION[$this->template->getIdUserSessionName()])) {
			$id_usuario_actual = $_SESSION[$this->template->getIdUserSessionName()];

			if($id_usuario_actual != $id_elemento) {
				// Se obtiene el objeto que se desea eliminar
				$obj_usuario = new Usuario($id_elemento);

				// Valido si el usuario es editable antes de continuar
				if($obj_usuario->editable) {
					if(!$obj_usuario->baja) {
						$obj_usuario->baja = TRUE;
						$obj_usuario->fecha_baja = date('d/m/Y');
					}
					else $obj_usuario->baja = FALSE;

					// Se manejan transacciones para interactuar con la BD
					$obj_usuario->trans_begin();
					$obj_usuario->save();
					if ($obj_usuario->trans_status() === FALSE) // Se chequea el estado de la transacción
					{
					    $obj_usuario->trans_rollback(); // Si la transacción falló, hago un rollback
					}
					else
					{
					    $obj_usuario->trans_commit(); // Transacción exitosa, realizo el commit
					}

					$dataView['error'] = $obj_usuario->error->string; // Almaceno todos los errores que hubieran podido ocurrir					
				}
				else $dataView['error'] = 'El usuario ' . $obj_usuario->nombre_usuario . ' no puede editarse.';
			}
			else $dataView['error'] = 'Un usuario no puede cambiar su propio estado.';
		}
		else $dataView['error'] = 'No se ha iniciado sesión.';

		$this->ver_todos($dataView);
	}
}